perm filename PART2[00,BGB] blob
sn#098156 filedate 1974-04-24 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00007 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00003 00002
C00005 00003 3.0 WINGED EDGE PRIMITIVES.
C00043 00004 4.0 EULER MAKE PRIMITIVES.
C00045 00005 5.0 EULER KILL PRIMITIVES.
C00047 00006 7.0 EUCLIDEAN TRANSFORMATIONS.
C00050 00007 PART III
C00059 ENDMK
C⊗;
PART II - GEOMED AS A SAIL OR LISP ACCESSIBLE GRAPHICS COMMAND LANGUAGE.
1.0 Introduction to GEOMES and GEOMEL.
2.0 Memory, Control, Input and Output Routines.
GEOMED MKUNIV MKNODE KLNODE
MKWORLD MKCAMERA MKWINDOW
OUTB3D OUTGEM OUTCAM OUTVID
INB3D INGEM INCAM INCRE
3.0 Datum and Link Names:
XWC YWC ZWC AA BB CC XPP YPP ZPP
IX IY IZ JX JY JZ KX KY KZ
NFACE PFACE NED PED NVT PVT DAD SON BRO SIS
ALT ALT2 CW CCW CAR8 CDR8
4.0 Winged Edged Primitives:
MKB MKF MKE MKV MKFRAME
WING INVERT EVERT
ECW ECCW OTHER VCW VCCW FCW FCCW
BDET BATT BGET
5.0 Euler Routines:
MKBFV MKEV ESPLIT MKFE GLUEE
KLBFEV KLFE KLEV UNGLUE
GLUE MKCOPY SWEEP ROTCOM PYRAMID FVDUAL
MKCUBE MKCYLN MKBALL
BIN BUN BSUB MKCVEX
MKBUCK ECUT FCUT BCUT
6.0 Euclidean Routines:
TRANSL ROTATE SHRINK APTRAN INTRAN DISTANCE
NORM MKROT1 ORTHO1 ORTHO2 DETERM ANGL3V
7.0 Image Forming Routines:
GEODPY IIIDPY SHOW1 SHOW2 SHOW3 SHOW4
TAKE1 TAKE2 OCCULT SHADOW CLIPER
VPROJ UNPROJ FACOEF ECOEF
8.0 Arithmetic and Display Routines:
PI SQRT LOG SIN COS ATAN ATAN2 ASIN ACOS
DPYBUF DPYSST DPYSET DPYBIG DPYBRT
AVECT AIVECT RVECT RIVECT DPYOUT
3.0 WINGED EDGE PRIMITIVES.
3.1 MKB,MKF,MKE,MKV,MKFRAME. Make BFEV Nodes.
3.2 WING,INVERT,EVERT Make and change wing pointers.
3.3 LINKED Find if two entities are linked.
3.4 ECW,ECCW, Edge fetching around FV perimeter.
3.5 OTHER,VCW,VCCW,FCW,FCCW Face-vertex fetching from an edge.
3.6 BDET,BATT,BGET Body parts linking and body get.
4.0 EULER MAKE PRIMITIVES.
4.1 BNEW ← MKBFV; Make vertex polyhedron.
4.2 VNEW ← MKEV(F,V); MAKES NEW EDGE AND VERTEX SUCH THAT:
VNEW = NVT(ENEW); V = PVT(ENEW);
VNEW ← ESPLIT(E); MAKES NEW EDGE AND VERTEX...
4.3 ENEW ← MKFE(V1,F,V2); MAKES NEW FACE AND EDGE SUCH THAT:
FNEW = NFACE(ENEW); F = PFACE(ENEW);
V1 = PVT(ENEW); V2 = NVT(ENEW).
4.4 ENEW ← GLUEE(F1,V1,F2,V2); MAKES NEW EDGE, KILLS F2,
AND MAKES A HOLE OR KILLS A BODY.
V1 = PVT(ENEW); V2 = NVT(ENEW).
4.2 VNEW ← MKEV(FACE,VERTEX);
VNEW ← ESPLIT(EDGE);
Make a new edge and a new vertex in the given FACE from the
given VERTEX; the new vertex is return, VNEW; the new edge can be
accessed by taking PED(VNEW).
ESPLIT, makes a new edge and a new vertex, VNEW; the new edge may be
obtained by taking PED(VNEW); the new edge is place between VNEW and
PVT(EDGE).
4.3 ENEW ← MKFE(V1,FACE,V2);
Make a new face and a new edge by joining V1 and V2 of FACE.
The new edge is returned, ENEW; the new face may always be obtained
by taking NFACE(ENEW).
5.0 EULER KILL PRIMITIVES.
5.1 QNEW ← KLBFEV(Q); Kill entity.
5.2 F ← KLFE(E); Kill E and NFACE(E), return PFACE(E).
5.3 E ← KLEV(V); Kill V and PED(V), return other E of V.
V ← KLEV(E); Kill E and NVT(E), retirn PVT(E).
5.4 FNEW ← UNGLUE(E); Undo an GLUEE.
.....................................................................
6.0 EASY POLYHEDRON ROUTINES.
6.1 BODY ← GLUE(FACE1,FACE2); Glue face-face.
6.2 QNEW ← MKCOPY(ENTITY); Make copy.
6.3 FACE ← SWEEP(FACE,FLAG); Sweep cylinder.
6.4 FACE ← ROTCOM(FACE); Rotation completion.
6.5 PEAK ← PYRAMID(FV); Make pyramid on a face (or vertex).
6.6 BODY ← FVDUAL(BODY); Make face/vertex dual of a body.
6.7 BNEW ← MKCUBE(DX,DY,DZ); Make right rectangular prism.
6.8 BNEW ← MKCYLN(RADIUS,N,DZ); Make right cylinder.
6.9 BNEW ← MKBALL(RADIUS,M,N); Make sphere approximation.
7.0 EUCLIDEAN TRANSFORMATIONS.
FRAME ← TRANSLATE(INTEGER ENTITY; REAL DELTAX,DELTAY,DELTAZ);
FRAME ← ROTATE(INTEGER ENTITY; REAL ABOUTX,ABOUTY,ABOUTZ);
FRAME ← SHRINK(INTEGER ENTITY; REAL SCALEX,SCALEY,SCALEZ);
When the ENTITY argument is non-zero, these subroutines
perform the indicated Euclidean Transformation: translation,
rotation, dilation and reflection. When the ENTITY argument is ZERO,
then a FRAME node representing the desired transformation is
returned.
FRAMES and EUCLIDEAN TRANSFORMATIONS
A frame node has two intrepretations: it may be used to
represent a frame of reference or it may be used to specify a
Euclidean transformation.
As a frame of reference the XWC, YWC, ZWC datums contain the
location of the origin of the frame in world coordinates; and the
remaining nine datums IX,IY,IZ, JX,JY,JZ, KX,KY,KZ are the components
of three unit vectors I, J, and K that determine a right handed
rectangular Cartesian coordinate system. The nine components of the
unit vectors form an orthonormal rotation matrix.
As a Euclidean transformation, the frame is applied to the
3-D world coordinates of an entity Q to make new coordinates.
---------------------------------------------------------------------
| APTRAN's inner most subroutine. |
| Expects arguments in V and Q. Clobbers 1,2,X,Y,Z. |
| |
| X ← XWC(V); |
| Y ← YWC(V); |
| Z ← ZWC(V); |
| |
| XWC(V) ← X*IX(Q) + Y*JX(Q) + Z*KX(Q) + XWC(Q); |
| YWC(V) ← X*IY(Q) + Y*JY(Q) + Z*KZ(Q) + YWC(Q); |
| ZWC(V) ← X*IZ(Q) + Y*JZ(Q) + Z*KZ(Q) + ZWC(Q); |
---------------------------------------------------------------------
HOMOGENEOUS COORDINATES
The interpretation of frame nodes can be given in the
four by four notation of homogeneous coordinates.
PART III
SYSTEMS PROGRAMMING NOTES:
The GEOMES source files are all found on the disk area [GEM,HE];
the file Z.CMD is an RPG command file such that the monitor command
"COMPILE @Z.CMD" will compile everything.
MAKING A GEOMEL
.R ILISP 50
---------------------------------------------------------------------
DESCRIPTION OF GEOMED MACHINE CODE.
The over all program structure of GEOMED is determined by the
urge to have approximately one subroutine per page of source code.
The subroutine calling conventions are SAIL like; accumulator 17
(named "P") is used as a push down list for arguments and return
addresses; a calling sequence goes: PUSH P,ARG↔ PUSH P,ARG↔ ... PUSHJ
P,SUBR and a subroutine return must fix up the stack SUB P,[XWD
N+1,N+1] and JRST @N+1(P).
The somewhat unusal appearance of GEOMED machine code arises
from the use of FAIL assembler macros to implement ALGOL like
subroutine notation and KNUTH like datum/link notation; and from the
use of double-arrow "↔" to place more than one machine instruction per
line and the use of seven alternate PDP-10 mnemonics.
The seven alternate PDP-10 mnemonics are LAC, DAC, CAR, CDR,
DIP, DAP and GO for MOVE, MOVEM, HLRZ, HRRZ, HRLM, HRRM and JRST
respectively. The LAC, DAC, DIP, DAP come from PDP-1 nomensclature
and are shorter and more pronoucible than their PDP-10 equivalents.
The CAR and CDR are from LISP which got them from the IBM-709. The
GO comes from ALGOL and is shorter and more descriptive than JRST.
The PDP-10 op code names sacrifice pronoucibility for systematic
nomensclature; and although I once proposed having alternate concise
euphonious names for the most frequently used operations; the idea
was quite unpopular and so I have abandoned it for all except the
above seven mnemonics.